/**
 * @Title: Three
 * @Author kerry
 * @Package PACKAGE_NAME
 * @Date 2024/11/21 22:27
 */

public class Three {
    public static void main(String[] args) {
        // 加强理解Java的值传递方式
        // https://blog.csdn.net/qq_47897078/article/details/120211873
        /**
         * 值传递：调用函数时将实际参数复制一份传递到函数中，这样在函数中如果对参数进行修改，将不会影响到实际参数。
         * 引用传递：在调用函数时将实际参数的地址直接传递到函数中，那么在函数中对参数所进行的修改，将影响到实际参数。
         */

        // 方式一：
        int num = 10;
        t(num);
        System.out.println("num is "+num);// 10 证明值传递

        // 方式二：
        String name = "hello";
        s(name);
        System.out.println("name is "+name);// hello

        // 方式三：传递对象引用（地址）
        // 思考：Java是值传递，为什么这里会影响到原对象输出呢？
        // 注意：这里传递的值是对象引用（地址），意思把栈中的地址传递给了函数，形参复制了一份。
        // Java传递对象参数，值的内容是对象的引用。
        User user = new User();
        user.setAge(20);
        user.setPost("厨师");
        u(user);
        System.out.println("原来 user is "+user);//  user is User{age=30, post='保安'}

        // 方式四：
        // 结合上面思考内容：假设Java是引用传递，那么输出应该【程序员】才对
        // 但下面
        User userTow = new User();
        userTow.setAge(30);
        userTow.setPost("环卫工人");
        ut(userTow);
        System.out.println("userTow user is "+userTow);// userTow user is User{age=30, post='环卫工人'}
    }

    public static void t(int num) {
        num++;
        System.out.printf("t num is %d",num);// 11
    }


    public static void s(String s) {
        s = "world";
        System.out.printf("s name is %s",s);// world
    }

    public static void u(User u) {
        u.setAge(30);
        u.setPost("保安");
        System.out.println("user is "+u);//user is User{age=30, post='保安'}
    }

    public static void ut(User u) {// 实参 复制了一份地址给形参u
        u = new User();// u 又指向了新的对象地址
        u.setPost("程序员");
        System.out.println("ut user is "+u);// ut user is User{age=0, post='程序员'}
    }


}

class User {
    private int age;
    private String post;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPost() {
        return post;
    }

    public void setPost(String post) {
        this.post = post;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", post='" + post + '\'' +
                '}';
    }
}
